//
// Created by user on 20-3-10.
//

/**
 * 打印函数的头文件
 */

#ifndef _PRINTF_H_
#define _PRINTF_H_

/*======================== 导入头文件区域 ==========================*/

#include <stdarg.h>
#include "../Font/FontASCII.h"
#include "Linkage.h"
#include "Lib.h"
#include "../MemoryManagement/Memory.h"
#include "../ProcessManagement/ProcessSync/Spinlock.h"

/*======================== 宏定义区域 ==========================*/

#define ZEROPAD        1        /* 使用零进行的填充 */
#define SIGN        2        /* unsigned/signed long */
#define PLUS        4        /* 加 */
#define SPACE        8        /* space if plus */
#define SUBTRACT    16        /* 减 */
#define SPECIAL        32        /* 0x */
#define SMALL        64        /* use 'abcdef' instead of 'ABCDEF' */

/**
 * 这个是判断是否为数字的宏函数，其实就是一个表达式
 */
#define isDigit(c) ( (c) >= '0' && (c) <= '9' )

/**
 * 定义常用的颜色的宏
 */
#define WHITE   0x00FFFFFF      // 白色
#define BLACK   0x00000000      // 黑色
#define RED     0x00FF0000      // 红色
#define ORANGE  0x00FF8000      // 橙色
#define YELLOW  0x00FFFF00      // 黄色
#define GREEN   0x0000FF00      // 绿色
#define BLUE    0x000000FF      // 蓝色
#define INDIGO  0x0000FFFF      // 靛色
#define PURPLE  0x008000FF      // 紫色

/*======================== 全局变量区域 ==========================*/

/**
 * 引用外部变量 fontASCII
 */
//extern unsigned char fontASCII[256][16];

/**
 * 创建一个全局的缓冲区
 */
extern char buffer[4096];

extern unsigned char fontASCII[][16];

/**
 * 显示信息结构体，这个里面都是显示所需要的结构体
 * 注意：后面顺便创建了这个结构体的变量
 */
struct DisplayInfo {

    int resolutionX;        // 分辨率X
    int resolutionY;        // 分辨率Y

    int cursorPositionX;    // 光标位置X
    int cursorPositionY;    // 光标位置Y

    int charSizeWidth;      // 字符矩阵宽
    int charSizeHeight;     // 字符矩阵高

    unsigned int *fontBufferAddr;  // 字体缓存区地址
    unsigned long fontBufferLength; // 字体缓存区长度

    spinlock_T printkLock;          // 打印自旋锁

} displayInfo;

/*======================== 声明函数区域 ==========================*/

#define do_div(n, base) ({ \
int __res; \
__asm__("divq %%rcx":"=a" (n),"=d" (__res):"0" (n),"1" (0),"c" (base)); \
__res; })

/**
 * 初始化帧缓存地址
 */
void frameBufferInit();

/**
 * 打印不同颜色的字体和背景色的字符串
 * @param fontColor 字体的颜色
 * @param backgroundColor 背景颜色
 * @param formatString 格式化字符串
 * @param ... 可变参数
 * @return 可变参数的长度
 */
int printfColor(unsigned int fontColor, unsigned int backgroundColor, const char *formatString, ...);

void printChar(unsigned int *fontBufferAddr, int resolutionX, int currentX,
               int currentY, unsigned int fontColor, unsigned int backgroundColor,
               unsigned char font);

int vsprintf(char *buffer, const char *formatString, va_list args);

char *number(char *str, long num, int scale, int fieldWidth, int precision, int type);

int skip_atoi(const char **s);

#endif //_PRINTF_H_
